package py.com.sole.solesys;

import java.io.Serializable;
import java.util.List;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FlowEvent;
import org.primefaces.event.SelectEvent;
import py.com.sole.dao.DaoFactory;
import py.com.sole.model.Articulo;
import py.com.sole.model.Proveedor;
import py.com.sole.model.TipoArticulo;

@ManagedBean
@SessionScoped
public class ArticuloBean implements Serializable {

  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private final static Logger logger = Logger.getLogger(ArticuloBean.class);

  private String descripcion;
  private Double precioAdquisicion;
  private Double precioVenta;
  private Integer existencia;
  private Proveedor proveedorSelected;
  private TipoArticulo tipoArticulo;
  private String sector;
  private Boolean active;
  private List<Articulo> articulos;
  private Articulo articuloSelected;
  private Articulo articulo;
  private Proveedor proveedor;

  private boolean bloquearBotones = true;

  @PostConstruct
  private void init() {
    articuloSelected = new Articulo();
    articulos = DaoFactory.getArticulo().getArticulos();
  }

  public String onFlowProcess(FlowEvent event) {
    return event.getNewStep();
  }

  public void clean() {

    this.setDescripcion(null);
    this.setPrecioAdquisicion(null);
    this.setPrecioVenta(null);
    this.setExistencia(null);
    this.setTipoArticulo(null);
    this.setProveedorSelected(null);
    this.setSector(null);
    this.articuloSelected = null;
    this.setBloquearBotones(true);

  }

  public void saveArticulo() {
    FacesContext context = FacesContext.getCurrentInstance();

    Articulo a = DaoFactory.getArticulo().getArticuloByName(descripcion);

    if (a != null) {
      context.addMessage(null, new FacesMessage("Advertencia",
                                                "El articulo " + descripcion
                                                + " ya se encuentra registrado"));
      this.clean();
      return;
    }

    Articulo art = new Articulo();
    art.setDescripcion(descripcion);
    art.setPrecioAdquisicion(precioAdquisicion);
    art.setPrecioVenta(precioVenta);
    art.setExistencia(existencia);
    art.setProveedor(proveedorSelected);
    art.setTipoArticulo(tipoArticulo);
    art.setSector(sector);
    art.setActivo(true);
    
    DaoFactory.getArticulo().addArticulo(art);

    context.addMessage(null, new FacesMessage("Mensaje", "Articulo "
                                              + descripcion + " almacenada exitosamente"));

    articulos = DaoFactory.getArticulo().getArticulos();

    this.clean();
  }

  public void onRowSelect(SelectEvent event) {

    this.articuloSelected = (Articulo) event.getObject();
    this.articulo = DaoFactory.getArticulo().getArticuloById(this.articuloSelected.getId());
    descripcion = articulo.getDescripcion();
    precioAdquisicion = articulo.getPrecioAdquisicion();
    precioVenta = articulo.getPrecioVenta();
    existencia = articulo.getExistencia();
    proveedorSelected = articulo.getProveedor();
    tipoArticulo = articulo.getTipoArticulo();
    sector = articulo.getSector();

    this.setBloquearBotones(false);
    RequestContext.getCurrentInstance().update("form-edit:pnlGridArticulo");
    RequestContext.getCurrentInstance().update("form-edit");
    RequestContext.getCurrentInstance().update("articulo-form");
  }

  public void onRowProveedor(SelectEvent event) {
    this.proveedorSelected = (Proveedor) event.getObject();

    RequestContext.getCurrentInstance().execute("dlgProveedorList.hide()");
    RequestContext.getCurrentInstance().update("articulo-form:pnlArticulos");
  }

  @SuppressWarnings(value = "all")
  public boolean filterByNombre(Object value, Object filter, Locale locale) {

    String filterText = (filter == null) ? null : filter.toString().trim();

    if (filterText == null || filterText.equals("")) {
      return true;
    }

    if (value == null) {
      return false;
    }

    return ((Comparable<String>) value).compareTo(filterText) > 0;

  }

  public void deleteArticulo() {
//    DaoFactory.getArticulo().deleteArticulo(this.getArticuloSelected().getId());
    Articulo art = DaoFactory.getArticulo().getArticuloById(
      this.getArticuloSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    art.setDescripcion(descripcion);
    art.setPrecioAdquisicion(precioAdquisicion);
    art.setPrecioVenta(precioVenta);
    art.setExistencia(existencia);
    art.setProveedor(proveedorSelected);
    art.setTipoArticulo(tipoArticulo);
    art.setSector(sector);
    art.setActivo(false);

    DaoFactory.getArticulo().updateArticulo(art);
    context.addMessage(null, new FacesMessage("Mensaje", "Articulo "
                                              + " eliminado exitosamente"));

    articulos = DaoFactory.getArticulo().getArticulos();
    this.clean();
  }

  public void editArticulo() {
    Articulo art = DaoFactory.getArticulo().getArticuloById(
      this.getArticuloSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    art.setDescripcion(descripcion);
    art.setPrecioAdquisicion(precioAdquisicion);
    art.setPrecioVenta(precioVenta);
    art.setExistencia(existencia);
    art.setProveedor(proveedorSelected);
    art.setTipoArticulo(tipoArticulo);
    art.setSector(sector);

    DaoFactory.getArticulo().updateArticulo(art);
    context.addMessage(null, new FacesMessage("Mensaje", "Articulo "
                                              + " editado exitosamente"));

    articulos = DaoFactory.getArticulo().getArticulos();
    this.clean();
  }

  public List<Articulo> getArticulos() {
    if (articulos == null) {
      articulos = DaoFactory.getArticulo().getArticulos();
    }
    return articulos;
  }

  public void setArticulos(List<Articulo> articulos) {
    this.articulos = articulos;
  }

  public String getDescripcion() {
    return descripcion;
  }

  public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
  }

  public Double getPrecioAdquisicion() {
    return precioAdquisicion;
  }

  public void setPrecioAdquisicion(Double precioAdquisicion) {
    this.precioAdquisicion = precioAdquisicion;
  }

  public Double getPrecioVenta() {
    return precioVenta;
  }

  public void setPrecioVenta(Double precioVenta) {
    this.precioVenta = precioVenta;
  }

  public Integer getExistencia() {
    return existencia;
  }

  public void setExistencia(Integer existencia) {
    this.existencia = existencia;
  }

  public Proveedor getProveedorSelected() {
    return proveedorSelected;
  }

  public void setProveedorSelected(Proveedor proveedorSelected) {
    this.proveedorSelected = proveedorSelected;
  }

  public TipoArticulo getTipoArticulo() {
    return tipoArticulo;
  }

  public void setTipoArticulo(TipoArticulo tipoArticulo) {
    this.tipoArticulo = tipoArticulo;
  }

  public Articulo getArticuloSelected() {
    return articuloSelected;
  }

  public void setArticuloSelected(Articulo articuloSelected) {
    this.articuloSelected = articuloSelected;
  }

  public boolean isBloquearBotones() {
    return bloquearBotones;
  }

  public void setBloquearBotones(boolean bloquearBotones) {
    this.bloquearBotones = bloquearBotones;
  }

  public Articulo getArticulo() {
    return articulo;
  }

  public void setArticulo(Articulo articulo) {
    this.articulo = articulo;
  }

  public Proveedor getProveedor() {
    return proveedor;
  }

  public void setProveedor(Proveedor proveedor) {
    this.proveedor = proveedor;
  }

  public String getSector() {
    return sector;
  }

  public void setSector(String sector) {
    this.sector = sector;
  }

}
